package com.yfp.client.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerNotifyV3Result;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerRefundNotifyV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.yfp.client.domain.MallOrder;
import com.yfp.client.domain.dto.MallOrderAddressDTO;
import com.yfp.client.domain.dto.MallOrderListReqDTO;
import com.yfp.client.domain.dto.PackSettleDTO;
import com.yfp.client.domain.vo.MallOrderListReqVO;
import com.yfp.common.core.domain.LogisticsInfoVO;
import com.yfp.common.core.web.page.TableDataInfo;

import java.util.List;

/**
 *
 * @description 针对表【mall_order(商城订单)】的数据库操作Service
 * @createDate 2025-03-05 10:54:48
 */
public interface MallOrderService extends IService<MallOrder> {

    /**
     * 套餐结算
     *
     * @param packSettleDTO
     * @return
     */
    Long settle(PackSettleDTO packSettleDTO);

    /**
     * 套餐结算-去支付前校验
     *
     * @param mallOrderId
     * @return
     */
    Boolean settleOrderCheck(Long mallOrderId);

    /**
     * 套餐结算-正式付款,微信and积分
     *
     * @param mallOrderId
     * @return
     */
    WxPayUnifiedOrderV3Result.JsapiResult rechargeSettlePayment(Long mallOrderId);

    /**
     * 套餐结算-正式付款,积分
     *
     * @param mallOrderId
     * @return
     */
    void rechargeSettlePaymentIntegral(Long mallOrderId);

    /**
     * 取消订单
     *
     * @param mallOrderId
     * @return
     */
    Boolean cancelOrder(Long mallOrderId);

    /**
     * 确认收货
     *
     * @param mallOrderId
     * @return
     */
    Boolean confirmOrder(Long mallOrderId);

    /**
     * 修改订单收货地址
     *
     * @param mallOrderAddressDTO
     * @return
     */
    void updateAddress(MallOrderAddressDTO mallOrderAddressDTO);

    /**
     * 校验传入数据
     *
     * @param mallProductId
     */
    void checkProductSettle(Long mallProductId);

    /**
     * 创建订单
     *
     * @param packSettleDTO
     * @return
     */
    Long createSettle(PackSettleDTO packSettleDTO);

    /**
     * 更新订单预支付id
     *
     * @param id
     * @param wxPrepayId
     */
    void updatePrepayIdById(Long id, String wxPrepayId);

    /**
     * 订单创建回调
     *
     * @param wxPayPartnerNotifyV3Result
     */
    void orderCreateNotify(WxPayPartnerNotifyV3Result wxPayPartnerNotifyV3Result);

    /**
     * 根据订单号查询订单
     *
     * @param orderSn
     * @return
     */
    MallOrder getByOrderSn(String orderSn);

    /**
     * 客户订单列表查询
     *
     * @param mallOrderListReqDTO
     * @return
     */
    TableDataInfo<MallOrderListReqVO> getClientOrderList(MallOrderListReqDTO mallOrderListReqDTO);

    /**
     * 根据用户id和订单状态查询订单
     *
     * @param clientId
     * @param statusList
     * @return
     */
    List<MallOrder> listByClientIdAndStatusIds(String clientId, List<Integer> statusList);

    /**
     * 根据订单id查询订单信息
     *
     * @param mallOrderId
     * @return
     */
    MallOrderListReqVO getClientOrderInfo(Long mallOrderId);

    /**
     * 修改订单状态v
     *
     * @param orderSn
     * @param status
     */
    void updateStatus(String orderSn, Integer status);

    /**
     * 商城订单退款回调
     *
     * @param wxPayPartnerRefundNotifyV3Result
     */
    void mallOrderRefundNotify(WxPayPartnerRefundNotifyV3Result wxPayPartnerRefundNotifyV3Result);

    /**
     * 关闭订单
     *
     * @param mallOrderId
     */
    void closeOrder(Long mallOrderId);

    /**
     * 查询订单物流信息
     *
     * @param mallOrderId
     * @return
     */
    LogisticsInfoVO getOrderLogisticsInfo(Long mallOrderId);

    /**
     * 更新订单物流信息job
     */
    void updateOrderLogisticsInfoJob();
}
